這是什麼意思if(!fork())
?我有點困惑,我不知道,當林在父母子女的過程:if(!fork) - 這是什麼意思?
if(!fork())
{
// is it child or parent process?
}else{
// is it child or parent process?
}
這是什麼意思if(!fork())
?我有點困惑,我不知道,當林在父母子女的過程:if(!fork) - 這是什麼意思?
if(!fork())
{
// is it child or parent process?
}else{
// is it child or parent process?
}
返回值
成功時,子進程的PID返回父, 和0的孩子返回。如果失敗,則在 父項中返回-1,不會創建子進程,並且適當地設置errno。
由於fork()
返回0到孩子,如果從句的測試,如果它是一個孩子:
if (!fork()) // same as: if (fork() == 0)
{
// child
}else{
// parent
}
做man fork
,你會知道更多。 它實際上對於父進程的子進程,並正值返回pid_t
實際上int
是在成功返回它給,0
其實是這樣的:
pid_t pid;
pid=fork();
if(pid <0)
{
printf("fork failed");
return -1;
}
else if(pid == 0)
{
it is child process
}
else
{
It is parent process
}
,所以當你做if(!fork())
這意味着definitly child process
,因爲!0 == 1
即如果條件爲真,它將執行if(!fork())
因爲0
可以在有條件的可以使用,好像它是一個布爾值,這是一樣的問:
if(fork() == 0) {
文檔說:
如果成功,孩子的PID進程返回父進程中, 並且0在子進程中返回。如果失敗,則在 父項中返回-1,不會創建子進程,並且適當地設置errno。
這是一個常見的成語直接在條件使用整數值時譯碼器只關心「不0
」或0
(「真」或「假」)。
現在我明白了:D簡單而簡短的回答,謝謝! – mazix
對fork
的調用在孩子中返回0(當然,如果它有效),因此if
語句的真實(第一個)部分在那裏運行(因爲!0
爲true)。
錯誤(第二個)部分在父項中執行,是否fork
成功(返回子項的PID)或失敗(返回-1
)。
我並不是這種特殊方法的粉絲,因爲它沒有考慮到所有的邊緣情況。我喜歡這樣的:
pid_t pid = fork();
switch (pid) {
case -1: {
// I am the parent, there is no child, see errno for detail.
break;
}
case 0: {
// I am the child.
break;
}
default: {
// I am the parent, child PID is in pid, eg, for waitpid().
break;
}
}
使用這個配置,你知道究竟這是怎麼回事,沒有信息丟失。
的fork()
值可以是:
0,這意味着它是一個小孩
< 0,這是一個錯誤
> 0母體,這意味着它是一個父
由於if (!fork())
是寫if (fork() == 0)
的僅有很短的方式,它的意思是:
if(!fork()) {
// it is a child process
}
else {
// it is a parent process
}
if(!fork())
{
/* its child, as child would only be created on success and return 0 which would have been turned into true by ! operator */
}else{
/* it is parent because either success or failed, fork would have returned nonzero value and ! would have made it false */
}
該代碼沒有按不檢查叉子的錯誤!當已經有很多進程正在運行時,或者沒有足夠的內存時,分支將失敗,並且您的軟件可能會以非常奇怪的方式運行。
多數民衆贊成它,謝謝!現在我完全理解它!謝謝:) – mazix
唯一的問題是,它不會區分父錯誤。 – pmg
@pmg:既然它沒有記錄孩子的pid,大概父母並不關心它發生了什麼。所以也許它不在乎是否有錯誤。 –