C プログラミングはよく知っていますが、Unix システム コールの経験はあまりありません。久しぶりに Unix の知識を再確認しています。そこで、fork と execlp のシステム コールから始めました。ubuntu_linux で例を練習しています。
以下は、STD_IN からコマンドを受け取り、それを子プロセスで実行する教科書のサンプル プログラムです。
int main (int argc, char *argv[]) {
char command[MAX_LINE];
pid_t pid;
int status;
printf ("%% ");
while (fgets (command,MAX_LINE,stdin ) != NULL){
if (command[strlen(command)-1] == '\n')
command[strlen(command)-1] = '\0';
if ((pid=fork ()) < 0) {
perror ("fork failed : \n");
}
if (pid == 0) {
printf (" I am child and my PID is %d",getpid ());
execlp (command, command, (char *)0);
perror ("couldn't execute:");
exit(127);
}
printf (" I am parent and my PID is %d\n ",getpid ());
if ((pid = waitpid (pid, &status, 0)) < 0){
perror("waitpid error\n");
}
printf ("%% ");
}
exit (0);
}
いくつかのステートメントを入力しましたが、コマンドが正常に実行されるたびに、プログラムは「I am child and my PID is」printf
という行を出力しませんでした。ただし、入力コマンドが間違っていて失敗した場合は、上記の行が出力されます。
print ステートメントが before であるため、両方のシナリオで行が印刷されることを期待していますexeclp
。